package com.nexfra.vocsys.voc.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nexfra.vocsys.common.domain.AttachFile;
import com.nexfra.vocsys.common.domain.User;
import com.nexfra.vocsys.voc.dao.VocMyjobMngrDao;

@Service
public class VocMyjobMngrService {
	private static final Logger logger = LoggerFactory.getLogger(VocMyjobMngrService.class);
	
	@Autowired
	private VocMyjobMngrDao dao;

	/**
	 * VOC등록 - 본인 처리
	 * @return vodId
	 */ 
	@Transactional(rollbackFor = Exception.class)  
	public void saveSelf(HashMap<String, String> sqlParams, User user, List<AttachFile> attachFiles) 
			throws Exception {
//@TODO com_id 가져오기
		String vocId = dao.selectSeqVocId(sqlParams); // voc_id 채번
		String receiptId = dao.selectSeqReceiptId(sqlParams); // receipt_id 채번
		
		String userId = user.getUserId();
		sqlParams.put("com_id", user.getComId());
		sqlParams.put("user_id", userId);
		sqlParams.put("proc_dept_id", user.getUserDeptId()); // 처리부서
		sqlParams.put("proc_user_id", userId); // 처리자
		sqlParams.put("receipt_id", receiptId); // 접수ID
		sqlParams.put("voc_id", vocId);
		
//@TEST
sqlParams.put("customer_type", "1"); // 고객유형(고객사에 따라 달라질수있음)	>>>>>>>>>>>> form에 삽입	
sqlParams.put("reg_channel", "1"); // 등록채널(고객사에 따라 달라질수있음)	 >>>>>>>>>>>> form에 삽입
sqlParams.put("reg_channel_type", "1"); // 	(고객사에 따라 달라질수있음)
sqlParams.put("sms_flag", null == sqlParams.get("sms_flag")?"N":"Y");
sqlParams.put("email_flag", null == sqlParams.get("email_flag")?"N":"Y");
sqlParams.put("tel_flag", null == sqlParams.get("tel_flag")?"N":"Y");
sqlParams.put("post_flag", null == sqlParams.get("post_flag")?"N":"Y");
sqlParams.put("visit_flag", null == sqlParams.get("visit_flag")?"N":"Y");
sqlParams.put("no_resp_flag", null == sqlParams.get("no_resp_flag")?"N":"Y");

sqlParams.put("email_id", sqlParams.get("email_id1")+"@"+sqlParams.get("email_id2")); // 이메일id >>>>>>>>>>>> form에 삽입	
sqlParams.put("old_address", ""); // old address >>>>>>>>>>>> form에 삽입	
sqlParams.put("birthday", null == sqlParams.get("birthday")?"":sqlParams.get("birthday")); // birthday >>>>>>>>>>>> form에 삽입	
sqlParams.put("gender", null == sqlParams.get("gender")?"":sqlParams.get("gender")); // gender >>>>>>>>>>>> form에 삽입	
sqlParams.put("age", null == sqlParams.get("age")?"":sqlParams.get("age")); // age >>>>>>>>>>>> form에 삽입	
sqlParams.put("nationality", null == sqlParams.get("nationality")?"":sqlParams.get("nationality")); // nationality >>>>>>>>>>>> form에 삽입	

sqlParams.put("exem_flag", null == sqlParams.get("exem_flag")?"N":sqlParams.get("exem_flag")); // 만족도조사대상여부
sqlParams.put("proc_status", "PRO2200"); // 처리상태 :: PRO2200	처리자 지정
sqlParams.put("del_flag", "N"); // 삭제여부
sqlParams.put("devide_type", "N"); // voc분할구분

//@TODO 고객테이블에 등록해야함

		{	// voc마스터 등록
			dao.insertMasterVoc(sqlParams);
			
			// voc마스터 변경이력 등록
			dao.insertHistoryMasterVoc(sqlParams);
		} 
		{	// voc내용 등록
			/**
			 01	VOC 내용
			 02	등록자 의견
			 03	접수자 의견
			 04	처리 요청 사항
			 05	처리 결과
			 06	처리자 의견
			 07	승인자 의견
			*/
			sqlParams.put("content_type", "02");
			dao.insertContent(sqlParams);
			
			// voc내용 변경 이력 등록
			dao.insertHistoryContent(sqlParams);
		}
		{	// voc고객정보 등록
			dao.insertCustomer(sqlParams);
			// voc고객정보 변경 이력 등록	
			dao.insertHistoryCustomer(sqlParams);
			
		}
		{	// voc처리 프로세스 등록
			/**
			  PRO1000	접수 요청
			  PRO2000	부서 지정
			  PRO2200	처리자 지정
			 */
			// 접수 요청
			sqlParams.put("proc_seq", "1");
			sqlParams.put("proc_status", "PRO1000");
//@TODO 고객ID 확인....			
			sqlParams.put("before_charge_id", sqlParams.get("customer_name"));
			sqlParams.put("charge_id", userId);
			dao.insertProcess(sqlParams);				
			
			// 부서 지정
			sqlParams.put("proc_seq", "2");
			sqlParams.put("proc_status", "PRO2000");
			sqlParams.put("before_charge_id", userId);
			sqlParams.put("charge_id", userId);
			dao.insertProcess(sqlParams);		
			
			// 처리자 지정
			sqlParams.put("proc_seq", "3");
			sqlParams.put("proc_status", "PRO2200");
			sqlParams.put("before_charge_id", userId);
			sqlParams.put("charge_id", userId);
			dao.insertProcess(sqlParams);		
		}
		{	// voc첨부파일 등록
			if(attachFiles.size() > 0) {
				HashMap<String,String> params = null;
				for(AttachFile file: attachFiles) {
					params = new HashMap<String,String>();
					params.put("com_id", user.getComId());
					params.put("voc_id", vocId);
					params.put("proc_seq", "1");
					params.put("attach_file_name", file.getOriginFileName());
					params.put("attach_alias", file.getAliasFileName());
					params.put("attach_path", file.getFileTotalPath());
					params.put("attach_size", file.getFileSize());
					params.put("attach_extension", file.getFileExtension());
					params.put("user_id", userId);
					
					dao.insertAttachFile(params);	
				}
				
			}
		}
	}	

	/**
	 * VOC등록 - 접수요청
	 * @return
	 */ 
	@Transactional(rollbackFor = Exception.class) 
	public void saveReq(HashMap<String, String> sqlParams, User user, List<AttachFile> attachFiles) 
			 throws Exception {
//@TODO com_id 가져오기
		String vocId = dao.selectSeqVocId(sqlParams); // voc_id 채번
		String receiptId = dao.selectSeqReceiptId(sqlParams); // receipt_id 채번
		
		String userId = user.getUserId();
		sqlParams.put("com_id", user.getComId());
		sqlParams.put("user_id", userId);
		sqlParams.put("proc_dept_id", user.getUserDeptId()); // 처리부서
		sqlParams.put("proc_user_id", userId); // 처리자
		sqlParams.put("receipt_id", receiptId); // 접수ID
		sqlParams.put("voc_id", vocId);
		
//@TEST
		sqlParams.put("customer_type", "1"); // 고객유형(고객사에 따라 달라질수있음)	>>>>>>>>>>>> form에 삽입	
		sqlParams.put("reg_channel", "1"); // 등록채널(고객사에 따라 달라질수있음)	 >>>>>>>>>>>> form에 삽입
		sqlParams.put("reg_channel_type", "1"); // 	(고객사에 따라 달라질수있음)
		sqlParams.put("sms_flag", null == sqlParams.get("sms_flag")?"N":"Y");
		sqlParams.put("email_flag", null == sqlParams.get("email_flag")?"N":"Y");
		sqlParams.put("tel_flag", null == sqlParams.get("tel_flag")?"N":"Y");
		sqlParams.put("post_flag", null == sqlParams.get("post_flag")?"N":"Y");
		sqlParams.put("visit_flag", null == sqlParams.get("visit_flag")?"N":"Y");
		sqlParams.put("no_resp_flag", null == sqlParams.get("no_resp_flag")?"N":"Y");
		
		sqlParams.put("email_id", sqlParams.get("email_id1")+"@"+sqlParams.get("email_id2")); // 이메일id >>>>>>>>>>>> form에 삽입	
		sqlParams.put("old_address", ""); // old address >>>>>>>>>>>> form에 삽입	
		sqlParams.put("birthday", null == sqlParams.get("birthday")?"":sqlParams.get("birthday")); // birthday >>>>>>>>>>>> form에 삽입	
		sqlParams.put("gender", null == sqlParams.get("gender")?"":sqlParams.get("gender")); // gender >>>>>>>>>>>> form에 삽입	
		sqlParams.put("age", null == sqlParams.get("age")?"":sqlParams.get("age")); // age >>>>>>>>>>>> form에 삽입	
		sqlParams.put("nationality", null == sqlParams.get("nationality")?"":sqlParams.get("nationality")); // nationality >>>>>>>>>>>> form에 삽입	
		
		sqlParams.put("exem_flag", null == sqlParams.get("exem_flag")?"N":sqlParams.get("exem_flag")); // 만족도조사대상여부
		sqlParams.put("proc_status", "PRO2200"); // 처리상태 :: PRO2200	처리자 지정
		sqlParams.put("del_flag", "N"); // 삭제여부
		sqlParams.put("devide_type", "N"); // voc분할구분
		
//@TODO 고객테이블에 등록해야함
		
		{	// voc마스터 등록
			dao.insertMasterVoc(sqlParams);
			
			// voc마스터 변경이력 등록
			dao.insertHistoryMasterVoc(sqlParams);
		} 
//@TODO ??? 각각의 코드는 어느때 사용하는지 확인하자!!!!!!!! 		
		{	// voc내용 등록
			/**
			 01	VOC 내용
			 02	등록자 의견
			 03	접수자 의견
			 04	처리 요청 사항
			 05	처리 결과
			 06	처리자 의견
			 07	승인자 의견
			 */
			sqlParams.put("content_type", "02");
			dao.insertContent(sqlParams);
			
			// voc내용 변경 이력 등록
			dao.insertHistoryContent(sqlParams);
		}
		{	// voc고객정보 등록
			dao.insertCustomer(sqlParams);
			// voc고객정보 변경 이력 등록	
			dao.insertHistoryCustomer(sqlParams);
			
		}
		{	// voc처리 프로세스 등록
			/**
			  PRO1000	접수 요청
			  PRO2000	부서 지정
			  PRO2200	처리자 지정
			 */
			// 접수 요청
			sqlParams.put("proc_seq", "1");
			sqlParams.put("proc_status", "PRO1000");
//@TODO 고객ID 확인....			
			sqlParams.put("before_charge_id", sqlParams.get("customer_name"));
			sqlParams.put("charge_id", userId);
			dao.insertProcess(sqlParams);				
		}
		{	// voc첨부파일 등록
			if(attachFiles.size() > 0) {
				HashMap<String,String> params = null;
				for(AttachFile file: attachFiles) {
					params = new HashMap<String,String>();
					params.put("com_id", user.getComId());
					params.put("voc_id", vocId);
					params.put("proc_seq", "1");
					params.put("attach_file_name", file.getOriginFileName());
					params.put("attach_alias", file.getAliasFileName());
					params.put("attach_path", file.getFileTotalPath());
					params.put("attach_size", file.getFileSize());
					params.put("attach_extension", file.getFileExtension());
					params.put("user_id", userId);
					
					dao.insertAttachFile(params);	
				}
				
			}
		}
//if(true) throw new Exception("#강제 exception");
	}	
}
